package FIT::Document::Parser::t::Text;

use FIT::Test 'FIT::Document::Parser::Text';
use utf8;

# test support code is a "little" long, actual test cases are in
# __DATA__ block, scroll down!!!

# TODO check for errors:
# 1- too many quotes
# 2- quotes not at end of string
# 3- malformed bytes and unicode
# TODO tests should use FIT::Util::SpecialChars, so they are easy to change

sub html_to_text: Tests {
    my $self = shift;
    local $_;
    my @groups = parse_groups(join '', <DATA>);
    for my $group (@groups) {
        my $group_name  = $group->{name};
#        diag '-'x7 . '='x12 . "< Testing $group_name >". '='x12 . '-'x7;
        my @cases = @{ $group->{cases} };
        for my $case (@cases) {
            my ($html, $text, $rem) = map { $case->{$_} } qw(html text rem);
            my $bare_html           = visible_to_string($html);
            my $bare_text           = visible_to_string($text);
            my $sane_html           = $self->IUT->prepare_for_read($bare_html);
            my $actual              = $self->compute_html_to_text($sane_html);
            my $visible_actual      = string_to_visible($actual);

            # avoid Test::Builder warnings when printing diag with wide chars
            if ($actual eq $bare_text) { ok 1, "html_to_text ($group_name, $rem)" }
            else {
                fail
                    "($group_name) $rem, HTML=[$html], ".
                    "ACTUAL=[$visible_actual], EXPECTED=[$text]";
            }
        }
    }
}

sub compute_html_to_text {
    my $html = pop;
    return IUT->html_to_text($html);
}

sub parse_groups() {
    my $cases = shift;
    my @groups;
    for (split /^\s*$/m, $cases) {
        my $group_name = $_;
        s/\n(?:.*\n){4}//m;
        s/^\W*$//mg;
        s/\n\s*\n/\n/mg;
        s/^\n//;
        s/\n$//;
        my @cases =  map { parse_case($_) } split /\n/;
        $group_name = (split /\n/, $group_name)[2];
        push @groups, {
            name  => trim($group_name),
            cases => [@cases],
        };
    }
    return @groups;
}

sub parse_case() {
    my @in = split /\s*│\s*/, shift;
    for (@in) { $_ = trim($_) }
    return {html => $in[0], text => $in[1], rem  => $in[2]};
}

sub visible_to_string() {
    my $in = shift;
    for ($in) {
        s/S/ /g;
        s/T/\t/g;
        s/N/\n/g;
        s/Z/\xFF/g;
        s/X/\x{05D0}/g;
    }
    return $in;
}

sub string_to_visible() {
    my $in = shift;
    for ($in) {
        s/ /S/g;
        s/\t/T/g;
        s/\n/N/g;
        s/\xFF/Z/g; # an arbitary byte, not UTF-8 valid
        s/\x{05D0}/X/g;
    }
    return $in;
}

sub trim() {
    my $in = shift;
    for ($in) { s/^\s+//; s/\s+$//; }
    return $in;
}

__DATA__

 ─────────────────────────────────────────────────────────────────────────────────────────
 Character Conversions                    
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 foo                            │ foo      │ simple WYSIWYG                              
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 &amp;&lt;&gt;&nbsp;&quot;      │ &<>S"    │ entity expansion                            
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aSbNcTd                        │ aSbScSd  │ newlines and tabs into space                 
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 ©                              │ ©        │ utf-8 untouched                             
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 a<br/><p>&nbsp;</p>b           │ aNSNb    │ BR & P converted to newline, &nbsp; to space 
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 a¬b                            │ aTb      │ tab special converted to tab
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────
                                          
 ─────────────────────────────────────────────────────────────────────────────────────────
 Unknown Tags                             
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <x/>a<y>b</y>                  │ ab       │ all tags except P & BR removed               
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aS<x>b</x>NNc                  │ a b c    │ whitespace kept but folded around unknowns              
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────
                                          
 ─────────────────────────────────────────────────────────────────────────────────────────
 Trimming Whitespace                                          
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 STaSNN                         │ a        │ leading/trailing spaces/tabs/newlines trimmed
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <br/>&nbsp;<p>a</p>&nbsp;      │ a        │ leading/trailing BRs/&nbsp;/P trimmed
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 &nbsp;ST<p>N<br/></p>          │          │ nothing but space is empty
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────
                                          
 ─────────────────────────────────────────────────────────────────────────────────────────
 Folding Whitespace                                          
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aSSTTNNb                       │ aSb      │ spaces/newlines/tabs folded
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 a&nbsp;&nbsp;¬¬b               │ aSSTTb   │ &nbsp; and tab marker not folded
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>a</p><p><br/><br/></p>b     │ aNNNb    │ BR and /P have special folding rules
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aS&nbsp;SN&nbsp;TSb            │ aSSSSSb  │ space between &nbsp; folded
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aS&nbsp;b                      │ aSSb     │ space between &nbsp; folded, but not too much
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aNN<br/>S<br/>&nbsp;b          │ aSNNSb   │ no folding before BR
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 aS<br/>NSSb                    │ aSNb     │ folding after BR
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>aNN</p><p>S</p>&nbsp;b      │ aNSb     │ folding before /P
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>aSS</p>NSb                  │ aNb      │ folding after /P
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>aNN</p><p>&nbsp;</p>&nbsp;b │ aNSNSb   │ no folding before /P if it's a &nbsp;
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>a<br><br></p>b              │ aNNb     │ one newline folded before /P
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 <p>a<br><br></p>bS&nbsp;cβFF   │ aNNbSScZ │ space folds correctly near newlines
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────
                                          
 ─────────────────────────────────────────────────────────────────────────────────────────
 Custom Octets and UTF-8 Encoded Unicode  
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 β41A                           │ AA       │ 7-bit ascii octet
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 βFFβ41                         │ ZA       │ 8-bit illegal UTF-8, an arbitary byte
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 μ05D0                          │ X        │ Unicode code point notation
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────
                                          
 ─────────────────────────────────────────────────────────────────────────────────────────
 Quoting to Override Trimming             
 ───────────────────────────────┬──────────┬──────────────────────────────────────────────
 HTML                           │ text     │ comment                                     
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 Sa&nbsp;S<br/>T                │ a        │ trimmed without quotes
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 ‡Sa&nbsp;<br/>‡                │ SaSN     │ not trimmed with quotes
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 a&nbsp;STN<br/><br/>N‡         │ aSSNN    │ quoting on only one side
 ───────────────────────────────┼──────────┼──────────────────────────────────────────────
 ‡‡                             │          │ 2 quotes is empty string
 ───────────────────────────────┴──────────┴──────────────────────────────────────────────



